#include<bits/stdc++.h>
using namespace std;
long long n,m,p;
int val[100010];
int a[25];
int cnt1;
// #define int long long
const long long mod=1000000007;
void dfs(int lst){
	if(lst==n){
		int tmp=0;
		for(int i=1;i<n;++i){
			tmp^=(a[i]*a[i+1]);
		}
		if(tmp&(1<<(m-1))) ++cnt1;
		return;
	}
	++lst;
	for(a[lst]=0;a[lst]<(1<<m);++a[lst]){
		dfs(lst);
	}
}

long long ksm(long long x,long long t){
	long long ret=1;
	while(t){
		if(t&1){
			ret=ret*x%mod;
		}
		x=x*x%mod;
		t>>=1;
	}
	return ret;
}

long long Solve(long long l,long long w){
	if(l<=1) return 0;
	long long t=ksm(ksm(2,w),l-1);
	t*=(ksm(2,w)-1);
	t%=mod;
	t*=ksm(2,mod-2);
	t%=mod;
	return (t+Solve(l-2,w)*ksm(2,w))%mod;
}
long long Solve2(long long l,long long w,long long v){
	if(l<=1) return 0;
	if(l==2){
		if(v==0) return 0;
		return ksm(2,w-1);
	}
	long long t=ksm(ksm(2,w),l-2);
	t*=(ksm(2,w)-1);
	t%=mod;
	t*=ksm(2,mod-2);
	t%=mod;
	return (t+Solve2(l-2,w,v)*ksm(2,w))%mod;
}


struct MMM{
	long long a[2][2];
};
MMM operator *(MMM x,MMM y){
	MMM ret;
	memset(ret.a,0,sizeof(ret.a));
	for(int i=0;i<2;++i){
		for(int j=0;j<2;++j){
			for(int k=0;k<2;++k){
				ret.a[i][k]+=x.a[i][j]*y.a[j][k];
			}
		}
	}
	for(int i=0;i<2;++i){
		for(int j=0;j<2;++j){
			ret.a[i][j]%=mod;
		}
	}
	return ret;
}
MMM mksm(MMM x,long long t){
	MMM ret;
	ret.a[0][0]=ret.a[1][1]=1;
	ret.a[0][1]=ret.a[1][0]=0;
	while(t){
		if(t&1){
			ret=ret*x;
		}
		x=x*x;
		t>>=1;
	}
	return ret;
}
long long Solve3(int l,int w,int v){
	MMM ret;
	if(l&1){
		// MMM ret;
		ret.a[0][0]=ksm(2,w);
		ret.a[1][0]=ret.a[1][1]=ret.a[0][1]=0;
		// return ret;
	}
	else{
		// MMM ret;
		ret.a[0][0]=ksm(2,w+w);
		ret.a[1][0]=ret.a[1][1]=ret.a[0][1]=0;
		if(v) ret.a[0][1]=ksm(2,w-1);
		// return ret;
	}
	MMM trans;
	trans.a[0][0]=ksm(2,w+w);
	long long tmp=ksm(2,w);
	tmp=tmp+mod-1;
	tmp=tmp*ksm(2,mod-2)%mod;
	trans.a[0][1]=tmp;
	trans.a[1][0]=0;
	trans.a[1][1]=ksm(2,w);
	trans=mksm(trans,(l-1)>>1);
	ret=ret*trans;
	return ret.a[0][1];
}

signed main(){
	// cin>>n>>m;
	// dfs(0);
	// cout<<cnt1<<endl;
	// cout<<Solve(n,m);
	// for(n=1;n<=20;++n){
	// 	for(m=1;m*n<=16;++m){
	// 		for(int t=0;t<(1<<m);++t){
	// 			a[1]=t;
	// 			cnt1=0;
	// 			dfs(1);
	// 			if(cnt1!=Solve2(n,m,t)) cout<<"WHAAAA!!!"<<n<<' '<<m<<' '<<t<<endl;
	// 			else cout<<"OKKKKK!!!"<<n<<' '<<m<<' '<<t<<' '<<cnt1<<endl;
	// 		}
	// 	}
	// }
	// for(n=1;n<=100;++n){
	// 	for(m=1;m<=100;++m){
	// 		for(int t=0;t<2;++t){
	// 			assert(Solve2(n,m,t)==Solve3(n,m,t));
	// 		}
	// 	}
	// }
	freopen("pearl.in","r",stdin);
	freopen("pearl.out","w",stdout);
	cin>>n>>m>>p;
	long long ans=0;
	int flag=0;
	for(int i=0;i<m;++i){
		char c=(char)getchar();
		if(isdigit(c)==false){
			--i;
			continue;
		}
		if(c=='1') flag=1;
		long long cl,cr;
		cl=Solve3(p,i+1,flag)*ksm(2,1ll*(p-1)*(m-i-1))%mod;
		cr=Solve3(n-p+1,i+1,flag)*ksm(2,1ll*(n-p)*(m-i-1))%mod;
		long long tmp;
		tmp=cl*(ksm(2,1ll*(n-p)*m)+mod-cr)+cr*(ksm(2,1ll*(p-1)*m)+mod-cl);
		tmp%=mod;
		ans=(ans+tmp*ksm(2,i))%mod;
	}
	cout<<ans;
	return 0;
}